// import router from './router'
// import store from './store'
// import { Message } from 'element-ui'
// import NProgress from 'nprogress' // progress bar
// import 'nprogress/nprogress.css' // progress bar style
// import { getToken } from '@/utils/auth' // get token from cookie
// import getPageTitle from '@/utils/get-page-title'

// NProgress.configure({ showSpinner: false }) // NProgress Configuration

// const whiteList = ['/login'] // no redirect whitelist

// router.beforeEach(async(to, from, next) => {
//   // start progress bar
//   NProgress.start()

//   // set page title
//   document.title = getPageTitle(to.meta.title)

//   // determine whether the user has logged in
//   const hasToken = getToken()

//   if (hasToken) {
//     if (to.path === '/login') {
//       // if is logged in, redirect to the home page
//       next({ path: '/' })
//       NProgress.done()
//     } else {
//       const hasGetUserInfo = store.getters.name
//       if (hasGetUserInfo) {
//         next()
//       } else {
//         try {
//           // get user info
//           await store.dispatch('user/getInfo')

//           next()
//         } catch (error) {
//           // remove token and go to login page to re-login
//           await store.dispatch('user/resetToken')
//           Message.error(error || 'Has Error')
//           next(`/login?redirect=${to.path}`)
//           NProgress.done()
//         }
//       }
//     }
//   } else {
//     /* has no token*/

//     if (whiteList.indexOf(to.path) !== -1) {
//       // in the free login whitelist, go directly
//       next()
//     } else {
//       // other pages that do not have permission to access are redirected to the login page.
//       next(`/login?redirect=${to.path}`)
//       NProgress.done()
//     }
//   }
// })

// router.afterEach(() => {
//   // finish progress bar
//   NProgress.done()
// })

// ------------------------------------------------
// 专门处理路由权限的，所以我们再这里处理
// 权限拦截 导航首位 路由首位 router
import router from '@/router' // 引入路由实例
import store from '@/store' // 一如vuex store实例
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度样式
// 定义一个白名单 所有不受权限控制的页面
const whiteList = ['/login', '/404']

// 定义前置以及后置首位
/*
 这里的三个参数分别表达
 1.to 即将要进入的目标路劲（路径对象）
 2.from 当前导航正要离开的路由（路由对象）
 3.next 此方法，如果想跳转的化，必须调用，否则路由将不会跳转
*/
router.beforeEach(async(to, from, next) => {
  NProgress.start() // start是开启进度条的意思
  // 首先要判断是否有token
  if (store.getters.token) {
    // 如果有token 继续判断是不是去登录页
    if (to.path === '/login') {
      // 表示去的是登录页
      next('/') // 跳到主页 // 有token的话,用户资料不用处理获取
    } else {
      // 只有在直接执行放过的时候才去获取用户资料
      // 不需要每次都获取
      // 如果当前vuex中有用户的资料的id 表示已经有资料了 不需要重新获取
      if (!store.getters.userId) {
        // dispatch：含有异步操作，是将数据提交至 actions ，可用于向后台提交数据
        // 由于dispatch 是异步操作,方式数据没获取到就直接跳转,需要将其转为同步操作

        // 调用getUserInfo 方法 获取roles
        const { roles } = await store.dispatch('user/getUserInfo')
        // 如果说后续 需要根据用户资料获取数据的话 这里必须改成同步
        // 筛选用户的可用路由
        // actions中函数 默认是Promise对象 调用这个对象 想要获取返回的值得花 必须加 await 或者是then
        // actions是做异步操作得
        const routes = await store.dispatch('permission/filterRoutes', roles.menus)

        // routes 就是筛选得到得动态路由
        // 动态路由 添加到路由表中 默认的路由表只有静态路由 没有动态路由
        // addRoutes必须用next(地址)，不能用next()
        // 由于子账号的权限页面会出现重新刷新出现404的情况 针对这种情况只需要把404添加在动态路由后面即可
        router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }]) // 添加动态路由到路由表 => 铺路
        next(to.path) // 相当于跳到对应的地址后 多做一次跳转
      } else {
        next() // 直接执行
      }
    }
  } else {
    // 如果没有token whiteList.indexOf(to.push > -1是指是指索引值，如果大于1则执行if的代码
    if (whiteList.indexOf(to.path) > -1) { // 判断要去的地址在不在白名单
      // 如果找打了，表示再白名单里面
      next() // 直接跳过
    } else {
      next('/login') // 跳转到主页
    }
  }
  NProgress.done()// 手动强制关闭一次，为了解决 手动切换地址时，进度条的不关闭的问题
})
// 后置守卫
router.afterEach(() => {
  NProgress.done() // done是关闭进度条
})
